/**
 * @Author: Jiang Zhongxun
 * @Date: 2024-10-04 00:39:33
 * @FilePath: /Socket/practiceProject/src/test/test.c
 * @Description: 测试
 */
#include "../../include/client/menu.h"
#include "../../include/db/dbDefinition.h"
#include "../../include/db/dbOperation.h"
#include "../../include/server/adminSys.h"
#include "../../include/server/daemon.h"
#include "../../include/server/loginAndRegister.h"
#include "../../include/server/userSys.h"
#include "../../include/utils/utils.h"

extern pid_t pid;
extern int is_shutdown; // 标识是否终止

int main(int argc, char const *argv[])
{

// 测试数据库的初始化
#if 1
    sqlite3 *db = databaseInit();
#endif

// 测试获取时间的工具接口
#if 0
    char *dateTimeStr = getCurrentDateTimeUtil();
    printf("Current DateTime: %s\n", dateTimeStr);
#endif

// 测试日志记录功能接口
#if 0
    char *errmsg = NULL;
    char *operationName = "logInfo";
    int row, column;
    char **result = NULL;
    char sql[256] = {0};
    char message[128] = {0};
    sprintf(sql, "SELECT userName FROM %s WHERE userType = %d;", USER_TABLE_NAME, ADMIN);
    // 调用 conditionQuery 执行查询操作
    result = conditionQuery(db, sql, &result, &row, &column, &errmsg, operationName);
    if (result == NULL)
    {
        fprintf(stderr, "查询失败: %s\n", errmsg ? errmsg : "未知错误");
        return -1;
    }
    printf("row = %d, columu = %d\n", row, column);
    if (0 == row)
    {
        printf("没有查到任何信息!\n");
        return 0;
    }
    else
    {
        // 悉数打印 row 行记录的数据
        int i, j;
        for (i = 1; i <= row; i++)
        {
            for (j = 0; j < column; j++)
            {
                // printf("%s\t", result[i * column + j]);
                printf("%s\n", result[i * column + j]); // 访问第 i 行的第 j 列
                fflush(stdout);                         // 强制刷新缓冲区
                snprintf(message, sizeof(message), "%s, 实际是系统日志, 初始化数据库成功!", result[i * column + j]);
            }
        }
    }
    printf("%s\n", message);
    // 将日志写入日志表
    int ret = logToLogInfoTable(db, OPERATELOG, message);
    if (ret != 0)
    {
        perror("测试的日志记录失败了!\n");
        return -1;
    }
    printf("测试的日志记录成功了!\n");
#endif

// 测试统计SQL
#if 0
    char *errmsg = NULL;
    char userName[20] = "root";
    char *operationName = "userInfo";
    int row, column;
    char **result = NULL;
    char sql[256] = {0};
    sprintf(sql, "SELECT COUNT(*) FROM %s WHERE userName = '%s';", USER_TABLE_NAME, userName);
    // 调用 conditionQuery 执行查询操作
    result = conditionQuery(db, sql, &result, &row, &column, &errmsg, operationName);
    if (result == NULL)
    {
        fprintf(stderr, "查询失败: %s\n", errmsg ? errmsg : "未知错误");
        return -1;
    }
    printf("row = %d, columu = %d\n", row, column);
    if (0 == row)
    {
        printf("没有查到任何信息!\n");
        return 0;
    }
    else
    {
        // 悉数打印 row 行记录的数据
        int i, j;
        for (i = 1; i <= row; i++)
        {
            for (j = 0; j < column; j++)
            {
                printf("统计结果为: %s\n", result[i * column + j]); // 访问第 i 行的第 j 列
                fflush(stdout);                                     // 强制刷新缓冲区
            }
        }
    }
    printf("\n");
#endif

// 测试用户注册接口
#if 0
    userRegister(db);
#endif

// 测试用户登录接口
#if 0
    userLogin(db, "jzx", "123456", NULL);
#endif

// 测试菜单展示
#if 0
    initMenu();
    printf("\n");
    userMenu();
    printf("\n");
    adminMenu();
#endif

// 测试管理员修改用户密码
#if 0
    changeUserPasswd(db);
#endif

// 测试管理员查询操作记录
#if 0
    queryOperationRecord(db);
#endif

// 测试管理员人工查验审核
#if 0
    manualAudit(db);
#endif

// 修改用户个人的驳回申请
#if 0
    updateCheckItem(db, "jzx");
#endif

// 删除用户个人的办结(已查验)记录
#if 0
    deleteCheckItem(db, "jzx");
#endif

// 检索用户个人的所有查验申请记录
#if 0
    searchCheckItem(db, "jzx");
#endif

// 用户发起查验申请
#if 0
    applyNewCheck(db, "jzx");
#endif

// 测试守护进程与日志记录
#if 0
    creatDaemonProcess();
    sqlite3 *db = databaseInit();
    while (1)
    {
        pid = fork();
        if (pid > 0)
        {
            // syslog(LOG_INFO, "守护进程正在监听服务端进程..."); // /var/log/syslog 日志
            logToLogInfoTable(db, SYSTEMLOG, "守护进程正在监听服务端进程...");
            waitpid(-1, NULL, 0);
            if (is_shutdown)
            {
                // syslog(LOG_NOTICE, "子进程已被回收, 即将关闭syslog连接, 守护进程退出"); // /var/log/syslog 日志
                logToLogInfoTable(db, SYSTEMLOG, "子进程已被回收,守护进程退出...");
                // closelog();
                exit(EXIT_SUCCESS);
            }
            // syslog(LOG_ERR, "服务端进程终止, 3s后重启..."); // /var/log/syslog 日志
            logToLogInfoTable(db, SYSTEMLOG, "服务端进程终止, 3s后重启...");
            sleep(3);
        }
        else if (pid == 0)
        {
            // syslog(LOG_INFO, "子进程fork成功"); // /var/log/syslog 日志
            // syslog(LOG_INFO, "启动服务端进程"); // /var/log/syslog 日志
            logToLogInfoTable(db, SYSTEMLOG, "子进程fork成功...");
            logToLogInfoTable(db, SYSTEMLOG, "启动服务端进程...");
            char *path = "/home/linux/Desktop/24072/Socket/practiceProject/src/server/server";
            char *argv[] = {"my_tcp_server", NULL};
            errno = 0;
            execve(path, argv, NULL);
            char buf[64];
            sprintf(buf, "errno: %d", errno);
            // syslog(LOG_ERR, "%s", buf); // /var/log/syslog 日志
            // syslog(LOG_ERR, "服务端进程启动失败"); // /var/log/syslog 日志
            logToLogInfoTable(db, SYSTEMLOG, buf);
            logToLogInfoTable(db, SYSTEMLOG, "服务端进程启动失败...");
            exit(EXIT_FAILURE);
        }
        else
        {
            // syslog(LOG_ERR, "子进程fork失败"); // /var/log/syslog 日志
            logToLogInfoTable(db, SYSTEMLOG, "子进程fork失败...");
        }
    }
#endif

    return 0;
}
